home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / DragClick / Sources / InitUtils.cpp < prev    next >
Text File  |  1996-06-21  |  3KB  |  157 lines

  1. // =============================================================================
  2. //
  3. //    InitUtils.cp
  4. //    
  5. //    Author: Greg Friedman
  6. //    Date:    MacHack '96
  7. //
  8. //    Do whatever you want with this source. Don't blame me if it doesn't work.
  9. //
  10. // =============================================================================
  11.  
  12. #ifndef __INITUTILS__
  13. #include "InitUtils.h"
  14. #endif
  15.  
  16. #ifndef __CONSTANTS__
  17. #include "Constants.h"
  18. #endif
  19.  
  20. Handle gExclusionList = NULL;
  21. Handle gInclusionList = NULL;
  22.  
  23. OSErr DetachInitResource(OSType resType, short resID)
  24. {
  25.     OSErr err = noErr;
  26.     
  27.     Handle resH = Get1Resource(resType, resID);
  28.     if (!h)
  29.         err = (ResError() ? ResError() : resNotFound);
  30.  
  31.     if (err == noErr)
  32.     {
  33.         char state = HGetState(resH);
  34.         if (!(state & kMemLockMask))
  35.         {
  36.             HLock(resH);
  37.             err = MemError();
  38.         }
  39.     }
  40.     
  41.     if (err == noErr)    // make sure it's in the system heap
  42.     {
  43.         THz zone = HandleZone(resH);
  44.         err = MemError();
  45.         
  46.         if (err == noErr && zone != SystemZone())
  47.             err = kError;
  48.     }
  49.     
  50.     if (err == noErr)
  51.     {
  52.         DetachResource(resH);
  53.         err = ResError();
  54.     }
  55.     
  56.     return err;
  57. }
  58.  
  59. void ExcludeCurrentProcess()
  60. {
  61.     OSErr     err;
  62.     OSType    signature;
  63.     
  64.     err = GetCurrentProcessSignature(&signature);
  65.     if (err != noErr)
  66.         return;
  67.     
  68.     if (!IsExcluded(signature))
  69.         AddToList(gExclusionList, signature);
  70. }
  71.  
  72. void AddToList(Handle list, OSType signature)
  73. {
  74.     Size startSize = GetHandleSize(list);
  75.     if (MemError() != noErr)
  76.         return;
  77.         
  78.     SetHandleSize(list, startSize + sizeof(OSType));
  79.     if (MemError() != noErr)
  80.         return;
  81.         
  82.     *(OSType*)((long)(*list) + startSize) = signature;
  83. }
  84.  
  85. Boolean IsInList(Handle list, OSType signature)
  86. {
  87.     Size handleSize = GetHandleSize(list);
  88.     OSType* curSig = *(OSType**)list;
  89.     OSType* endBound = (OSType*)((long)curSig + handleSize);
  90.     Boolean foundIt = FALSE;
  91.     
  92.     while (curSig < endBound && !foundIt)
  93.     {
  94.         if (*curSig++ == signature)
  95.             foundIt = TRUE;
  96.     }
  97.     
  98.     return foundIt;
  99. }
  100.  
  101. OSErr GetCurrentProcessSignature(OSType* signature)
  102. {
  103.     OSErr err;
  104.     ProcessSerialNumber psn;
  105.     ProcessInfoRec infoRec;
  106.     
  107.     infoRec.processInfoLength = sizeof(ProcessInfoRec);
  108.     infoRec.processName = NULL;
  109.     infoRec.processAppSpec = NULL;
  110.     psn.highLongOfPSN = 0;
  111.     psn.lowLongOfPSN = kCurrentProcess;
  112.     
  113.     err = GetProcessInformation(&psn, &infoRec);
  114.     if (err == noErr)
  115.         *signature = infoRec.processSignature;
  116.     return err;
  117. }
  118.  
  119. void InitializeLists()
  120. {
  121.     gExclusionList = LoadAndDetachSys(kListType, kExclusionListID);
  122.     if (!gExclusionList)
  123.         gExclusionList = NewHandleSys(0);
  124.     
  125.     gInclusionList = LoadAndDetachSys(kListType, kInclusionListID);
  126.     if (!gInclusionList)
  127.         gInclusionList = NewHandleSys(0);
  128. }
  129.  
  130. Handle LoadAndDetachSys(ResType type, short id)
  131. {
  132.     Handle resHandle;
  133.     
  134.     SetResLoad(FALSE);
  135.     resHandle = GetResource(type, id);
  136.     SetResLoad(TRUE);
  137.     
  138.     if (resHandle)
  139.     {
  140.         short attributes = GetResAttrs(resHandle);
  141.         SetResAttrs(resHandle, (attributes | resSysHeap));
  142.         DetachResource(resHandle);
  143.         DisposeHandle(resHandle);
  144.         
  145.         resHandle = GetResource(type, id);
  146.         if (resHandle)
  147.         {
  148.             SetResAttrs(resHandle, attributes);
  149.             DetachResource(resHandle);
  150.             HNoPurge(resHandle);
  151.             HUnlock(resHandle);
  152.         }
  153.     }
  154.     
  155.     return resHandle;
  156. }
  157.